package com.tedu.API.list;

import org.junit.Test;
/**
 * 导入包问题：同一包下的类
 *
 *     import java.util.ArrayList;
 *     import java.util.List;
 * 通配符  *  匹配当前包下所有的类
 *    import java.util.*;
 */
import java.util.*;


/**
 * List集合
 * Collection顶级集合【容器】----List集合【子接口】
 * List集合存储数据：存储有序并且重复的元素
 * List集合--接口--无法创建对象
 * 实现类
 * ArrayList:【常用：List与ArrayList的方法完全一致】数组实现
 * LinkList:双向连接实现
 * Vector:JDk1.0版本：性能：线程安全，增删效率慢
 * 重点：掌握List接口当中集合所有的方法
 */
public class ListAPI {
    /**
     * get(int index)方法  返回值：E
     * 作用：获取给定下标处的元素 从0开始
     */
    @Test
    public void testGet() {
        //List集合---多态创建集合
        List<String> list = new ArrayList<>();
        //Collection 提供add方法 | List 提供add方法【重写】
        list.add("三生三世十里桃花");
        list.add("你的名字");
        list.add("抓娃娃");
        System.out.println("List集合：" + list);
        //获取到List集合当中元素叫：你的名字
        String str = list.get(1);
        System.out.println("获取元素" + str);
        //需求：获取List集合中所有元素  --普通for
        for (int i = 0; i < list.size(); i++) {
            System.out.println("遍历" + list.get(i));
        }

    }

    /**
     * set(int index,E e)  返回值 E
     * 作用：将给定的元素设置到指定的下标位置处
     */
    @Test
    public void testSet() {
        List<String> list = new ArrayList<>();
        list.add("三生三世十里桃花");
        list.add("你的名字");
        list.add("抓娃娃");
        //需求：将list集合元素“你的名字”修改为“749局”
        list.set(1, "749局");
        System.out.println("修改后的list集合" + list);
    }
    /**
     * List继承Collection[重载：拓展功能，方法名相同，参数不同]
     * add(int index,E e)   返回值：void
     * 作用：将给定的元素插入到指定的位置
     * remove(int index) 返回值：E
     * 作用：将给定位置的元素从集合中删除
     *  查询块，曾删慢---选择List/ArrayList
     */
    @Test
    public void testAR() {
        //创建List集合--重写的方法add() 重载的方法add(下标，“元素”)
        List<String> list = new ArrayList<>();
        list.add("秦始皇");
        list.add("汉武帝");
        list.add("王按时");
        list.add("潘金莲");
        System.out.println("List集合元素" + list);
        list.add(3, "武大郎");
        System.out.println("list集合" + list);
        list.remove(2);
        System.out.println("list集合" + list);
    }
    /**
     * List集合
     * subList(int start,int end)  返回值 List<E>
     * 作用：截取范围内的子集【含头不含尾】
     *
     */
    @Test
    public void testSubList() {
        //创建集合：10个元素
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i <= 9; i++) {//循环针对下标
            list.add(i);
        }
        System.out.println("list集合" + list);
        //获取子集list集合中3~8
        List<Integer> listch = list.subList(3, 9);
        System.out.println("子集3~8" + listch);
        System.out.println("截取后的集合" + list);
        //获取子集list集合中2~6，子集元素扩大10倍

        List<Integer> lch = list.subList(2, 7);
        for (int i = 0; i < lch.size(); i++) {
            lch.set(i, lch.get(i)*10);
        }
        System.out.println("10倍后的" + lch);
        /**
         * 删掉清空lch子集  输出2~7
         * 特点 清空clear以及设置set直接对集合做操作
         */
        System.out.println("[list]"+list);
        lch.clear();
        System.out.println("清空子集"+list);
    }

    /**
     * 集合排序
     *
     * Random 伪随机数  包位置：java.util
     * nextInt()  返回伪随机整数【0~数值】
     * Collections 集合工具类  静态方法 :sort
     * sort()方法 :针对集合元素是数值进行排序【默认，升序，从小到大】 返回值List
     *  需求：随机生成10个元素【整数，100以内】的集合---对集合排序
     */
    @Test
    public void testArrayList(){
        //创建List集合<整数>
        List<Integer> list=new ArrayList<>();
        //创建伪随机数类
        Random r=new Random();
        for (int i=0;i<10;i++){
            list.add(r.nextInt(100));  //100以内的随机数
        }
        System.out.println("打印List"+list);
        //对list集合进行排序 Collections.sort(集合)
        Collections.sort(list);
        System.out.println("排序后的集合"+list);
    }
    /**
     * 需求：创建集合：排汉字，排序【没规则】
     * sort(集合,Comparator) 重载功能 :拓展排序功能
     * 集合：排序的集合
     * Comparator 比较器接口：指定规则--【定规则：按照字符串的长短排序】
     * 重写：compare()---定义规则，默认自带交换功能
     */
    @Test
    public void testComparator(){
        //创建集合--存汉字
        List<String> list=new ArrayList<>();
        list.add("孟涛");
        list.add("小骚秒");
        list.add("大傻勾");
        list.add("小略克子");
        //比较器的规则定义：按照字符串的长短进行排序
        Comparator<String> com=new Comparator<String>(){
            //compare方法：针对集合【自定义】排序
            //参数1：object o1 集合中假设第一个元素【交换】个元素
            //参数2：Object o2 集合中假设第二个【交换】元素
            public int compare(String o1, String o2) {
                /**
                 * 返回值 大于0   4-2 >0 交换
                 * 返回值 小于0   2-3 <0 不交换
                 * 返回值 等于0   不变
                 *
                 */
                return -(o1.length()-o2.length());
            }
        };

        Collections.sort(list,com);
        System.out.println("排序后的集合"+list);
    }
}
